In [1]:
/*
def functionName(parameterName: type, name: type, ...): return_type = {
statement
...
}
*/
def sum(a: Int, b:Int): Int = { // def 키워드로 함수 정의 '='뒤 중괄호 안에 함수 본문
val c = a + b // val 키워드로 상수 정의
println(c)
c // 마지막 라인의 값이 함수의 리턴값, 파이썬과 달리 return 키워드 사용안함
}
Out[1]:
In [2]:
sum(3, 4)
Out[2]:
In [3]:
// 주석
/* 주석2 */
/** 문서화 주석 */
class MyClass { // class 키워드는 클래스를 선언. 중괄호 `{`,`}` 사이에 클래스 본문
}
object MyModule { // object 키워드는 singletone객체(인스턴스가 하나인 객체) 생성
def abs(n: Int): Int = // 함수 본문의 statement가 하나면 중괄호 생략가능
if ( n < 0 ) { // if 키워드 뒤 소괄호안에 조건식 이후 중괄호 안에 조건문
-n
}
else n // 함수와 마찬가지로 본문 statement가 한개면 중괄호 생략가능
private def formatAbs(x: Int): String = { // private 메서드는 해당 객체에서만 호출
val msg: String = "The absolute value of %d is %d"
msg.format(x, abs(x))
}
def main(args: Array[String]): Unit = // Unit은 Java의 void, Python의 None과 비슷
println(-42)
}
Out[3]:
side effect는 함수의 입력값에 따른 결과값(return 값) 이외의 행동들에 대한 것들이다. 예를 들어 변수의 값을 수정, 화면에 문자를 출력 등의 작업이 side effect에 해당한다.
side effect가 없는 것을 pure(순수)하다고 한다.
함수에 정의된 어떤 expression(표현식)을 함수 본문에서 그 표현식을 모두 치환하여도 정상적으로 작동하는 것을 말한다.
예를들어, val x = “bug bug debug”
라는 expression이 있고 코드의 다른 부분에서 x를 사용하는 부분이 있다고 가정했을 때, 그 x를 등호의 오른쪽 표현식인 “bug bug debug”라는 스트링으로 치환 했을때, 코드의 동작이나 의미에 아무런 영향이 없으면 ‘참조에 투명하다’ 라고 한다.
In [1]:
// 참조에 투명한 경우
val x = "Hello, World"
val r1 = x.reverse
val r2 = x.reverse
Out[1]:
In [5]:
val r1_ = "Hello, World".reverse
val r2_ = "Hello, World".reverse
Out[5]:
In [6]:
// 참조에 투명하지 않은 경우
val l = new StringBuilder("Hello")
val m = l.append(", World")
val rr1 = m.toString
val rr2 = m.toString
Out[6]:
In [7]:
val b = new StringBuilder("Hello")
val rr1_ = b.append(", World").toString
val rr2_ = b.append(", World").toString
Out[7]:
In [8]:
// 일반적인 재귀함수
def sumToN(n: Int): Int = {
// @annotation.tailrec
def go(n: Int): Int =
if (n>0) n + go(n-1)
else 0
go(n)
}
sumToN(4)
Out[8]:
In [9]:
// 꼬리재귀함수
def factorial(n: Int): Int = {
// tailrec
// 재귀함수 서명위에 아래의 annotation(주해)를 추가하면
// 컴파일러가 꼬리재귀인지 검사해주고 아니면 에러를 냄
@annotation.tailrec
def go(n: Int, acc: Int): Int =
if(n<=0) acc
else go(n-1, acc*n)
go(n, 1)
}
factorial(4)
Out[9]:
In [1]:
def fib(n: Int): Int = {
@annotation.tailrec
def go(n: Int, acc: Int, pre: Int): Int = {
if( n <= 1 ) acc
else go(n-1, acc+pre, acc)
}
go(n, 1, 0)
}
Out[1]:
In [2]:
fib(10)
Out[2]:
In [ ]:
def isSorted[A](as: Array[A], ordered: (A,A) => Boolean): Boolean = {
def loop(n: Int): Boolean =
if (n == as.length -1) true
else if (ordered(as(n), as(n+1))) loop(n+1)
else false
loop(0)
}